package com.zhuhao.threaddemo;

import org.junit.Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Executor 管理多个异步任务的执行，而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰，不需要进行同步操作。
 * 主要有三种 Executor:
 * CachedThreadPool: 一个任务创建一个线程；
 * FixedThreadPool: 所有任务只能使用固定大小的线程；
 * SingleThreadExecutor: 相当于大小为 1 的 FixedThreadPool。
 *
 * @Author zhuhao
 * @Date 2022/6/1 10:48
 * @desc
 */
public class ExecutorTest {

    /**
     * 一个任务创建一个线程，打印顺序不一致
     */
    @Test
    public void cachedThreadPoolTest() {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            executorService.execute(() -> System.out.println(finalI));
        }
    }

    /**
     * 固定大小的线程池
     */
    @Test
    public void fixedThreadPoolTest() {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            executorService.execute(() -> System.out.println(finalI));
        }
    }

    /**
     * 只有一个线程的线程池
     */
    @Test
    public void singleThreadExecutorTest() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            executorService.execute(() -> System.out.println(finalI));
        }
    }
}
